﻿using System;
using System.Web;
using Business;
using Entity;
using Entity.Custom;
using Newtonsoft.Json;
using Utilities;

namespace FreshCms.BackEnd.Handler
{
    /// <summary>
    /// Summary description for Box
    /// </summary>
    public class Box : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {

        #region Declare variable for check pms
        Int32 ui = 0;
        InPms chkPms = new InPms();
        InUser CurrentUser = new InUser();
        #endregion

        public void ProcessRequest(HttpContext context)
        {
            string m = "";
            var response = new ResponseData();

            #region Get PanelId and Check Psm
            CurrentUser = InUserBusiness.GetSessionInUser();
            if (!string.IsNullOrEmpty(context.Request["ui"]))
            {
                Int32.TryParse(context.Request["ui"], out ui);
                if (ui > 0)
                    chkPms = InPmsBusiness.CheckSessionPms(ui);
                if (chkPms == null)
                    chkPms = new InPms { PmsView = 0, PmsUpdate = 0, PmsDelete = 0 };
            }
            #endregion



            if (context.Request.RequestType == "POST")
            {
                if (context.Request["m"] != null)
                    m = context.Request["m"];
                else
                    return;
            }
            else
            {
                if (context.Request.QueryString["m"] != null)
                    m = context.Request.QueryString["m"];
                else
                    return;
            }

            switch (m.ToLower())
            {
                case "addtobox":
                    response = AddToBox(context);
                    break;
                case "delete":
                    response = DeleteToBox(context);
                    break;
                case "order":
                    response = OrderBox(context);
                    break;
                case "publish":
                    response = PublishBox(context);
                    break;
            }

            context.Response.ContentType = "application/x-javascript";

            string callBack = context.Request["callback"];
            if (!string.IsNullOrEmpty(callBack))
            {
                context.Response.Write(callBack + "( " + JsonConvert.SerializeObject(response) + " );");
            }
            else
                context.Response.Write(JsonConvert.SerializeObject(response));
        }

        private ResponseData PublishBox(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["boxtype"])
                && !string.IsNullOrEmpty(context.Request["boxcate"])
                && !string.IsNullOrEmpty(context.Request["boximgW"])
                && !string.IsNullOrEmpty(context.Request["boximgH"]))
            {
                Int32 boxtype = 0;
                Int32.TryParse(context.Request["boxtype"], out boxtype);

                Int32 boxcate = 0;
                Int32.TryParse(context.Request["boxcate"], out boxcate);

                Int32 boximgW = 0;
                Int32.TryParse(context.Request["boximgW"], out boximgW);

                Int32 boximgH = 0;
                Int32.TryParse(context.Request["boximgH"], out boximgH);
                string boxname = context.Request["boxname"];

                
                if (boxtype == 0)
                {
                    InLogBusiness.InsertInLog(new InLog
                    {
                        UserId = CurrentUser.UserId,
                        LogAction = 3,
                        Field1 = "Xuất bản Box sản phẩm [" + boxname + "] thành công",
                        Field2 = "",
                        Field3 = "",
                        LogId = 0
                    });
                    var lstItem = OutProductBusiness.GetOutProductForBox(100, boxcate, boximgW, boximgH);
                    Utils.CreateFile(context.Server.MapPath("/") + "FrontEnd\\listfiles\\box_" + boxtype.ToString() + "_" + boxcate.ToString() + ".js", "var box_" + boxtype.ToString() + "_" + boxcate.ToString() + " = '" + JsonConvert.SerializeObject(lstItem) + "';");
                }
                else
                {
                    InLogBusiness.InsertInLog(new InLog
                    {
                        UserId = CurrentUser.UserId,
                        LogAction = 3,
                        Field1 = "Xuất bản Box tin tức [" + boxname + "] thành công",
                        Field2 = "",
                        Field3 = "",
                        LogId = 0
                    }); 
                    var lstItem = OutNewBusiness.GetOutNewForBox(100, boxcate, boximgW, boximgH);
                    Utils.CreateFile(context.Server.MapPath("/") + "FrontEnd\\listfiles\\box_" + boxtype.ToString() + "_" + boxcate.ToString() + ".js", "var box_" + boxtype.ToString() + "_" + boxcate.ToString() + " = '" + JsonConvert.SerializeObject(lstItem) + "';");
                }
                response.Data = null;
                response.Message = "Call Publish OK";
                response.Success = true;
            }
            else
            {
                response.Data = -1;
                response.Message = "Param Name, Status not valid";
                response.Success = false;
            }

            return response;
        }

        private ResponseData OrderBox(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["boxid"])
                && !string.IsNullOrEmpty(context.Request["boxtype"])
                && !string.IsNullOrEmpty(context.Request["action"])
                && !string.IsNullOrEmpty(context.Request["boxcate"])
                && !string.IsNullOrEmpty(context.Request["boximgW"])
                && !string.IsNullOrEmpty(context.Request["boximgH"]))
            {
                
                Int32 boxid = 0;
                Int32.TryParse(context.Request["boxid"], out boxid);
                
                Int32 boxtype = 0;
                Int32.TryParse(context.Request["boxtype"], out boxtype);

                Int32 action = 0;
                Int32.TryParse(context.Request["action"], out action);

                Int32 boxcate = 0;
                Int32.TryParse(context.Request["boxcate"], out boxcate);

                Int32 boximgW = 0;
                Int32.TryParse(context.Request["boximgW"], out boximgW);

                Int32 boximgH = 0;
                Int32.TryParse(context.Request["boximgH"], out boximgH);

                // custom for logger
                string itemname = context.Request["itemname"];
                string boxname = context.Request["boxname"];

                int returnval = OutBoxBusiness.OrderOutBox(boxid, boxcate, action);

                if (returnval > 0)
                {
                    if (boxtype == 0)// 0 la box san pham, 1 la box tin tuc
                    {
                        if (action == 0)
                        {
                            InLogBusiness.InsertInLog(new InLog
                            {
                                UserId = CurrentUser.UserId,
                                LogAction = 1,
                                Field1 = "Sắp xếp thứ tự sản phẩm trong Box: [" + boxname + "]",
                                Field2 = "Tên sản phẩm: " + itemname,
                                Field3 = "Sắp xếp: Đưa xuống dưới",
                                LogId = 0
                            });
                        }
                        else
                        {
                            InLogBusiness.InsertInLog(new InLog
                            {
                                UserId = CurrentUser.UserId,
                                LogAction = 1,
                                Field1 = "Sắp xếp thứ tự sản phẩm trong Box: [" + boxname + "]",
                                Field2 = "Tên sản phẩm: " + itemname,
                                Field3 = "Sắp xếp: Đưa lên trên",
                                LogId = 0
                            });
                        }
                        response.ExtData = OutProductBusiness.GetOutProductForBox(100, boxcate, boximgW, boximgH);
                    }
                    else // Neu la box tin tuc
                    {
                        if (action == 0)
                        {
                            InLogBusiness.InsertInLog(new InLog
                            {
                                UserId = CurrentUser.UserId,
                                LogAction = 1,
                                Field1 = "Sắp xếp thứ tự tin bài trong Box: [" + boxname + "]",
                                Field2 = "Tieu đề: " + itemname,
                                Field3 = "Sắp xếp: Đưa xuống dưới",
                                LogId = 0
                            });
                        }
                        else
                        {
                            InLogBusiness.InsertInLog(new InLog
                            {
                                UserId = CurrentUser.UserId,
                                LogAction = 1,
                                Field1 = "Sắp xếp thứ tự tin bài trong Box: [" + boxname + "]",
                                Field2 = "Tieu đề: " + itemname,
                                Field3 = "Sắp xếp: Đưa lên trên",
                                LogId = 0
                            });
                        }
                        response.ExtData = OutNewBusiness.GetOutNewForBox(100, boxcate, boximgW, boximgH);
                    }
                    

                    response.Data = returnval;
                    response.Message = "Call ORDER OK";
                    response.Success = true;
                    
                }
                else
                {
                    if (boxtype == 0)// 0 la box san pham, 1 la box tin tuc
                        response.Message = "Sản phẩm đang ở vị trí trên cùng hoặc dưới cùng.";    
                    else
                        response.Message = "Tin bài đang ở vị trí trên cùng hoặc dưới cùng.";
                    response.Data = returnval;
                    response.Success = false;
                }
                
            }
            else
            {
                response.Data = -1;
                response.Message = "Tham số gửi đi không đầy đủ.";
                response.Success = false;
            }

            return response;
        }

        private ResponseData DeleteToBox(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsDelete == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoDelete, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["itemname"])
                && !string.IsNullOrEmpty(context.Request["boxid"]))
            {
                Int32 itemid = 0;
                Int32.TryParse(context.Request["itemid"], out itemid);
                Int32 boxid = 0;
                Int32.TryParse(context.Request["boxid"], out boxid);
                Int32 boxcate = 0;
                Int32.TryParse(context.Request["boxcate"], out boxcate);
                Int32 boxtype = 0; // 0 la box san pham, 1 la box tin tuc
                Int32.TryParse(context.Request["boxtype"], out boxtype);
                Int32 boximgW = 0;
                Int32.TryParse(context.Request["boximgW"], out boximgW);
                Int32 boximgH = 0;
                Int32.TryParse(context.Request["boximgH"], out boximgH);
                // custom for logger
                string itemname = context.Request["itemname"];
                string boxname = context.Request["boxname"];

                int returnval = OutBoxBusiness.DeleteOutBox(boxid);

                response.Data = returnval;
                response.Message = "Call DELETE OK";
                response.Success = true;
                if (boxtype == 0)// 0 la box san pham, 1 la box tin tuc
                {
                    InLogBusiness.InsertInLog(new InLog
                                                  {
                                                      UserId = CurrentUser.UserId,
                                                      LogAction = 1,
                                                      Field1 = "Xóa sản phẩm khỏi Box: [" + boxname + "]",
                                                      Field2 = "Tên sản phẩm: " + itemname,
                                                      Field3 = "ID sản phẩm: " + itemid,
                                                      LogId = 0
                                                  });
                    response.ExtData = OutProductBusiness.GetOutProductForBox(100, boxcate, boximgW, boximgH);
                }
                else
                {
                    InLogBusiness.InsertInLog(new InLog
                                                  {
                                                      UserId = CurrentUser.UserId,
                                                      LogAction = 1,
                                                      Field1 = "Xóa tin bài khỏi Box: [" + boxname + "]",
                                                      Field2 = "Tiêu đề: " + itemname,
                                                      Field3 = "ID tin: " + itemid,
                                                      LogId = 0
                                                  });
                    response.ExtData = OutNewBusiness.GetOutNewForBox(100, boxcate, boximgW, boximgH);
                }
                
                
            }
            else
            {
                response.Data = -1;
                response.Message = "Tham số gửi đi không đầy đủ.";
                response.Success = false;
            }

            return response;
        }

        private ResponseData AddToBox(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["itemid"])
                && !string.IsNullOrEmpty(context.Request["boxcate"])
                && !string.IsNullOrEmpty(context.Request["boximg"])
                && !string.IsNullOrEmpty(context.Request["boximgW"])
                && !string.IsNullOrEmpty(context.Request["boximgH"])
                && !string.IsNullOrEmpty(context.Request["boxtype"]))
            {
                string boximg = context.Request["boximg"];
                Int32 itemid = 0;
                Int32.TryParse(context.Request["itemid"], out itemid);
                Int32 boxcate = 0;
                Int32.TryParse(context.Request["boxcate"], out boxcate);
                Int32 boxtype = 0; // 0 la box san pham, 1 la box tin tuc
                Int32.TryParse(context.Request["boxtype"], out boxtype);
                Int32 boximgW = 0;
                Int32.TryParse(context.Request["boximgW"], out boximgW);
                Int32 boximgH = 0;
                Int32.TryParse(context.Request["boximgH"], out boximgH);
                // custom for logger
                string itemname = context.Request["itemname"];
                string boxname = context.Request["boxname"];

                var obj = new OutBox
                {
                    ItemId = itemid,
                    BoxCategory = boxcate,
                    BoxImage = boximg,
                    BoxType = boxtype,
                    BoxId = 0
                };

                int returnval = OutBoxBusiness.InsertOutBox(obj);

                if (returnval > 0)
                {
                    try
                    {
                        // Sau khi insert ok thì gen ảnh thumb mặc định cho box là ảnh thumb avatar của sản phẩm
                        #region Gen ảnh thumb mặc định cho box item
                        var objThumb = new Thumbnailv2.Thumbnail();
                        objThumb.InputImage = context.Server.MapPath("/") + boximg;
                        objThumb.W = boximgW;
                        objThumb.H = boximgH;
                        var linkThumb = objThumb.CreateThumb();
                        #endregion
                    }
                    catch (Exception e) { }
                    
                    response.Data = returnval;
                    response.Message = "Call Insert OK, return new id inserted";
                    response.Success = true;
                    if (boxtype == 0)// 0 la box san pham, 1 la box tin tuc
                    {
                        response.ExtData = OutProductBusiness.GetOutProductForBox(100, boxcate, boximgW, boximgH);
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 1,
                            Field1 = "Thêm sản phẩm vào Box: [" + boxname + "]",
                            Field2 = "Tên sản phẩm: " + itemname,
                            Field3 = "ID sản phẩm: " + itemid,
                            LogId = 0
                        });
                    }
                    else
                    {
                        response.ExtData = OutNewBusiness.GetOutNewForBox(100, boxcate, boximgW, boximgH);
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 1,
                            Field1 = "Thêm tin vào Box: [" + boxname + "]",
                            Field2 = "Tiêu đề: " + itemname,
                            Field3 = "ID tin: " + itemid,
                            LogId = 0
                        });
                    }
                    
                }
                else if (returnval == 0)
                {
                    response.Data = returnval;
                    if (boxtype == 0)// 0 la box san pham, 1 la box tin tuc
                        response.Message = "Sản phẩm <b>[" + itemname + "]</b><br /> đã tồn tại trong box <b>[" + boxname + "]</b>";
                    else
                        response.Message = "Tin bài <b>[" + itemname + "]</b><br /> đã tồn tại trong box <b>[" + boxname + "]</b>";
                    response.Success = false;
                }
                else
                {
                    response.Data = returnval;
                    if (boxtype == 0)// 0 la box san pham, 1 la box tin tuc
                        response.Message = "Thêm sản phẩm vào box <b>[" + boxname + "]</b> không thành công.";
                    else
                        response.Message = "Thêm tin bài vào box <b>[" + boxname + "]</b> không thành công.";
                    response.Success = false;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Tham số gửi đi không đầy đủ.";
                response.Success = false;
            }

            return response;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}